package com.xframework.security.api;

import com.xframework.security.model.*;
import com.xframework.annotation.NotKey;
import com.xframework.api.BaseRpcService;

import java.util.List;

public interface SecurityRpcService extends BaseRpcService {
    /**
     * 登录
     *
     * @param account   封装用户名 密码
     * @param accountIp 客户端ip
     * @return SecurityAccount 返回封装登录信息的帐户对象
     */
    public SecurityAccount selectAccount(Account account, String applicationId, @NotKey String accountIp);

    public boolean validateAccountPassword(String accountPasswordExpress, String accountPasswordEncryption);

    /**
     * 查询某一应用下所有资源并返回map
     *
     * @param applicationId
     *            String
     * @return Map public List<String> selectAllResourceUrlByApplication(String
     *         applicationId);
     */

    /**
     * 添加帐户
     *
     * @param account 封装要添加的帐户信息
     * @return Account 返回包含accountId的帐户对象
     */
    public Account insertAccount(Account account);

    /**
     * 根据accountId修改帐户属性
     *
     * @param account 封装修改属性和过滤条件
     */
    public int updateAccount(Account account);

    /**
     * 根据accountWhere过滤条件修改accountSet帐户属性
     *
     * @param accountSet   封装要修改的帐户属性
     * @param accountWhere 封装修改过滤的条件
     * @return int 修改帐户的数量
     */
    public int updateAccountByAccount(Account accountSet, Account accountWhere);

    /**
     * 根据account中的属性删除相关帐户
     *
     * @param account 封装删除过滤条件
     */
    public int deleteAccount(Account account);

    /**
     * 查询帐户数量
     *
     * @param account 封装查询过滤的条件
     * @return 帐户数量
     */
    public int selectAccountNum(Account account);

    /**
     * 查询帐户
     *
     * @param account 封装查询过滤的条件
     * @return List<Account> 帐户List
     */
    public List<Account> selectAccountList(Account account);

    public List<Account> selectRoleAccountList(AccountRole accountRole);

    /**
     * 添加帐户扩展属性
     *
     * @param property 封装要添加的帐户扩展属性
     */
    public void insertAccountProperty(Property property);

    /**
     * 修改账户扩展属性 根据accountId修改庄户扩展属性
     *
     * @param property 封装修改帐户扩展属性
     */
    public void updateAccountProperty(Property property);

    /**
     * 删除账户扩展属性
     *
     * @param property 封装删除过滤条件
     */
    public void deleteAccountProperty(Property property);

    /**
     * 查询账户扩展属性
     *
     * @param property 封装查询过滤的条件
     * @return List<Property> 帐户扩展属性List
     */
    public List<Property> selectAccountPropertyList(Property property);

    /**
     * 先根据accountRole中的accountId和roleId删除帐户角色，再根据accountId和roleId添加用户角色
     *
     * @param accountRole 封装删除过滤条件
     */
    public void insertAccountRole(AccountRole accountRole, List<Role> roleList);

    /**
     * 查询账户角色
     *
     * @param accountRole 封装查询过滤条件
     * @return List<Role> 帐户角色List
     */
    public List<Role> selectAccountRoleList(AccountRole accountRole);

    /**
     * 添加应用
     *
     * @param application 封装要添加的应用
     * @return Application 返回包含applicationId的应用
     */
    public Application insertApplication(Application application);

    /**
     * 根据applicationId修改应用
     *
     * @param application 封装要修改的属性和过滤条件
     */
    public void updateApplication(Application application);

    /**
     * 删除应用
     *
     * @param application 封装要删除的过滤条件
     */
    public void deleteApplication(Application application);

    /**
     * 查询应用
     *
     * @param application 封装要查询的过滤条件
     * @return List<Application> 应用List
     */
    public List<Application> selectApplicationList(Application application);

    /**
     * 查询应用数量
     *
     * @param application 封装要查询的过滤条件
     * @return 应用数量
     */
    public int selectApplicationNum(Application application);

    /**
     * 添加资源
     *
     * @param resource 封装要添加的资源
     * @return Resource 包含resourceId的资源
     */
    public Resource insertResource(Resource resource);

    /**
     * 根据resourceId修改资源
     *
     * @param resource 封装要修改的属性和过滤条件
     * @return int 修改资源的数量
     */
    public int updateResource(Resource resource);

    /**
     * 删除资源
     *
     * @param resource 封装要删除的过滤条件
     */
    public void deleteResource(Resource resource);

    public List<Resource> selectResourceList(Resource resource);

    public ResourceType insertResourceType(ResourceType resourceType);

    public int updateResourceType(ResourceType resourceType);

    public void deleteResourceType(ResourceType resourceType);

    public List<ResourceType> selectResourceTypeList(ResourceType resourceType);


    /**
     * 查询包含全部资源的应用
     *
     * @param application 内置属性为空
     * @return List<Application> 包含全部资源的应用List
     */
    public List<Application> selectApplicationResourceList(Application application);

    /**
     * 添加角色
     *
     * @param role 封装添加的角色属性
     * @return Role 包含roleId的角色
     */
    public Role insertRole(Role role);

    public ThirdRole insertThirdRole(ThirdRole thirdRole);

    /**
     * 根据roleId修改角色
     *
     * @param role 封装修改的角色属性和过滤条件
     */
    public void updateRole(Role role);

    /**
     * 删除角色
     *
     * @param role 封装删除的过滤条件
     */
    public void deleteRole(Role role);

    /**
     * 查询角色
     *
     * @param role 封装查询的过滤条件
     * @return List<Role> 角色List
     */
    public List<Role> selectRoleList(Role role);

    public List<Role> selectThirdRoleList(ThirdRole thirdRole);

    /**
     * 查询角色数量
     *
     * @param role 封装查询的过滤条件
     * @return List<Role> 角色List
     */
    public int selectRoleNum(Role role);

    public int selectThirdRoleNum(ThirdRole thirdRole);

    /**
     * 先根据roleId和resourceId删除角色资源,再根据roleId和resourceIds添加角色资源
     *
     * @param roleResource 封装删除角色资源的过滤条件
     * @param resourceIds  角色对应的资源ID集合,多个resourceId之间用,间隔
     */
    public void insertRoleResource(RoleResource roleResource, String resourceIds);

    /**
     * 根据角色ID查询资源
     *
     * @param roleResource 封装查询过滤条件
     * @return List<Integer> 资源ID的List
     */
    public List<Resource> selectRoleResourceList(RoleResource roleResource);

    public List<Resource> selectAccountResourceList(SecurityAccount securityAccount);

    public String genRandom(String mobile, int length, int expireSencods);

    public boolean verifyRandom(String mobile, String random);

}